/*Fichier: latex.c Noemie Colin */
/*Affichage des arbres dans un fichier latex*/

#include <stdlib.h>
#include <strings.h>
#include "ptq.h"

/* permet laffichage de la formule directement dans la fichier Latex */
/* pour lafficher avant et apres la beta-reduction */

void affiche_latex_formule(FILE * sortie,noeud * racine)
{
  if (racine == NULL) return;
  switch (racine->type) {
  case AF:
    fprintf(sortie,"("); 
    affiche_latex_formule(sortie,racine->fg) ; 
    fprintf(sortie,"  ") ; 
    affiche_latex_formule(sortie,racine->fd) ;
    fprintf(sortie,")"); 
    break ; 
  case LAMBDA :
    fprintf(sortie,"$\\lambda$ "); 
    affiche_latex_formule(sortie,racine->fg) ; fprintf(sortie,"."); 
    fprintf(sortie," "); affiche_latex_formule(sortie,racine->fd) ; 
    break ; 
  case QUANT :
    fprintf(sortie,"%s ",(racine->val!=1)?"all":"some") ;
    affiche_latex_formule(sortie,racine->fg) ; 
    fprintf(sortie,". ");
    affiche_latex_formule(sortie,racine->fd) ;
    break ;
  case OP1 :fprintf(sortie,"not "); affiche_latex_formule(sortie,racine->fg) ;
    break ;
  case OP2 :
    fprintf(sortie,"("); affiche_latex_formule(sortie,racine->fg) ; 
    fprintf(sortie," %s ",(racine->val==1)?" and ":(racine->val==2)?" or ":" implies");
    affiche_latex_formule(sortie,racine->fd) ; fprintf(sortie,")");
    break ; 
  case EQ :
     fprintf(sortie,"(") ; affiche_latex_formule(sortie,racine->fg) ; fprintf(sortie,"=") ; 
     affiche_latex_formule(sortie,racine->fd) ; 
     fprintf(sortie,")") ;
    break ; 
  case PRD : 
  case VAR   : 
  case CTE   : {
    fprintf(sortie,"%s",string_tds(racine->type,racine->val));
    break ; 
  }
  }
}


/* permet laffichage de larbre dans le fichier arbre.tex */
void affiche(FILE * sortie,noeud * racine)
{

  if (racine == NULL) return;
  switch (racine->type) {

  case AF: 
    fprintf(sortie," \\pstree[nodesep=2pt]{\\TR{AF}}{\n ");
    affiche(sortie,racine->fg) ; fprintf(sortie,"  ") ; 
    affiche(sortie,racine->fd) ;
    fprintf(sortie,"} \n");
    break ; 
  case LAMBDA :
    fprintf(sortie,"  \\pstree[nodesep=2pt]{\\TR{LAMBDA}}{\n ");
    affiche(sortie,racine->fg) ;  
    affiche(sortie,racine->fd);
    fprintf(sortie,"} \n");
    break ; 
  case QUANT :
    fprintf(sortie,"\\pstree[nodesep=2pt]{\\TR{QUANT: %s }}{ ",(racine->val!=1)?"all":"some");
    affiche(sortie,racine->fg) ; 
    affiche(sortie,racine->fd) ;
    fprintf(sortie,"} \n");
    break ;
  case OP1 :
    fprintf(sortie, "\\pstree[nodesep=2pt]{\\TR{NOT}}{ ");
    affiche(sortie,racine->fg) ;
    fprintf(sortie,"} \n");
    break ;
  case OP2 :
    fprintf(sortie,"\\pstree[nodesep=2pt]{\\TR{OP2: %s}}{ ",(racine->val==1)?" and ":(racine->val==2)?" or ":" implies"); 
    affiche(sortie,racine->fg) ; 
    affiche(sortie,racine->fd) ; 
    fprintf(sortie,"} \n"); 
    break ; 
  case EQ:
    fprintf(sortie,"\\pstree[nodesep=2pt]{\\TR{EQ}}{");affiche(sortie,racine->fg) ; 
    affiche(sortie,racine->fd); fprintf(sortie,"} \n"); 
  case PRD :
    fprintf(sortie,"\\TR{PRD: %s} \n ",string_tds(racine->type,racine->val));
    break; 
  case VAR   : 
    fprintf(sortie,"\\TR{VAR: %s} \n",string_tds(racine->type,racine->val));
    break;
  case CTE   : {
   fprintf(sortie,"\\TR{CTE: %s} \n",string_tds(racine->type,racine->val));
    break ; 
  }
  }
}

/* permet dajouter le code latex repetitif */
void ajout_code_latex(FILE * sortie,noeud * racine)
{
  fprintf(sortie,"Formule: ");
  affiche_latex_formule((FILE *)sortie,(noeud *)racine);
  fprintf(sortie,"\n\\newline\n\\newline\nArbre:\n\\newline\n");
  fprintf(sortie," \\psset{levelsep=50pt,nodesep=2pt,linecolor=blue}\n");
  affiche((FILE *)sortie,(noeud *)racine);
  fprintf(sortie,"\\newline\n\\newline\n");

}



/* permet dajouter le debut dun fichier latex */
void init_latex(FILE * sortie){
  sortie=fopen("arbre.tex","w");
  fprintf(sortie,"\\documentclass[12pt , a4paper]{report}\n");
  fprintf(sortie,"\\usepackage{pst-all} \n\\begin{document}\n");
}

/* permet dajouter la fin dun fichier latex */
void end_latex (FILE * sortie){
  fprintf(sortie,"\\end{document}");
  fclose(sortie);
}

/* debut de code pour le fichier latex */
void commande_latex(FILE * sortie){
  fprintf(sortie,"\\documentclass[12pt , a4paper]{report}\n");
  fprintf(sortie,"\\usepackage{pst-all} \n\\begin{document}\n");
  tracef(1,"Debut enregistrement latex \n");
}

/* fin de code pour le fichier latex  */
void commande_arbre(FILE * sortie){
  end_latex(sortie);
  system("./latex.sh");
}
